/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cg.server.game;

import java.util.ArrayList;
import java.util.Arrays;

/**
 *
 * @author Tim Beer, Christian Friedli, Yanick Belart
 */
public class Spieler {

    private String name;
    private boolean istAktiv = false;
    private int id;
    ArrayList<Farbkarte> aufgenommeneKarten = new ArrayList<Farbkarte>();
    static int counter = 1;

    public Spieler(String name, boolean istAktiv, int id) {
        this.name = name;
        this.istAktiv = istAktiv;
        this.id = id;
    }

    public Spieler(String name) {
        this.name = name;
        this.istAktiv = false;
        this.id = counter;
        counter++;
    }

//     leerer Konstruktor
    public Spieler() {
        name = "";
        istAktiv = false;
        id = 1;
    }

    // Karte zur ArrayList aufgenommeneKarten hinzufügen
    public void karteAufnehmen(Farbkarte k) {
        aufgenommeneKarten.add(k);
    }

    // Aufgenommens ReihenArray zur ArrayList hinzufügen
    public void reiheAufnehmen(ArrayList<Farbkarte> kartenReihe) {
        aufgenommeneKarten.addAll(kartenReihe);
    }

    // Methode um die Punkte zu zählen. Dabei wird die ArrayList aufgenommeneKarten benutzt
    public int punkteZählen() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int magenta = 0;
        int orange = 0;
        int blau = 0;
        int braun = 0;
        int gelb = 0;
        int grau = 0;
        int gruen = 0;

        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //mit if/else if  wird Farbe der Karte abgefragt und die entsprechende Variable um +1 erhöht
        for (int a = 0; a < i; a++) {
            Farbkarte tmp = aufgenommeneKarten.get(a);

            //IDE hat Methode equals() vorgeschlagen
            // vorher:  if(tmp.getFarbe()=="magenta")
            if ("magenta".equals(tmp.getFarbe())) {
                magenta++;
            } else if ("orange".equals(tmp.getFarbe())) {
                orange++;
            } else if ("blau".equals(tmp.getFarbe())) {
                blau++;
            } else if ("braun".equals(tmp.getFarbe())) {
                braun++;
            } else if ("gelb".equals(tmp.getFarbe())) {
                gelb++;
            } else if ("grau".equals(tmp.getFarbe())) {
                grau++;
            } else if ("gruen".equals(tmp.getFarbe())) {
                gruen++;
            } else {
                System.out.println();
            }
        }

        //Die Variablen, welche jeweils die Anzahl Karten pro Farbe wiederspiegeln, werden in ein Array übergeben
        int[] AnzahlKarten = new int[7];
        AnzahlKarten[0] = magenta;
        AnzahlKarten[1] = orange;
        AnzahlKarten[2] = blau;
        AnzahlKarten[3] = braun;
        AnzahlKarten[4] = gelb;
        AnzahlKarten[5] = grau;
        AnzahlKarten[6] = gruen;

        //Im Array werden die Zahlen mit der Methode sort() der Reihe nach geordnet (aufsteigend)
        Arrays.sort(AnzahlKarten);

        //Variablen für Addition und Subtraktion der Punkte
        int pluspunkte = 0;
        int minuspunkte = 0;


        //Berechnung Pluspunkte
        //Die letzten drei Stellen des Arrays werden geprüft. 
        //Dort sind die drei höchsten Zahlen zu finden, weil aufsteigend sortiert.
        for (int x = 6; x >= 4; x--) {
            if (AnzahlKarten[x] >= 6) {
                pluspunkte = pluspunkte + 21;
            } else if (AnzahlKarten[x] == 5) {
                pluspunkte = pluspunkte + 15;
            } else if (AnzahlKarten[x] == 4) {
                pluspunkte = pluspunkte + 10;
            } else if (AnzahlKarten[x] == 3) {
                pluspunkte = pluspunkte + 6;
            } else if (AnzahlKarten[x] == 2) {
                pluspunkte = pluspunkte + 3;
            } else if (AnzahlKarten[x] == 1) {
                pluspunkte = pluspunkte + 1;
            } else if (AnzahlKarten[x] == 0) {
                pluspunkte = pluspunkte;
            } else {
                System.out.println();
            }
        }

        //Berechnung Minuspunkte
        for (int y = 3; y >= 0; y--) {
            if (AnzahlKarten[y] >= 6) {
                minuspunkte = minuspunkte - 21;
            } else if (AnzahlKarten[y] == 5) {
                minuspunkte = minuspunkte - 15;
            } else if (AnzahlKarten[y] == 4) {
                minuspunkte = minuspunkte - 10;
            } else if (AnzahlKarten[y] == 3) {
                minuspunkte = minuspunkte - 6;
            } else if (AnzahlKarten[y] == 2) {
                minuspunkte = minuspunkte - 3;
            } else if (AnzahlKarten[y] == 1) {
                minuspunkte = minuspunkte - 1;
            } else if (AnzahlKarten[y] == 0) {
                minuspunkte = minuspunkte;
            } else {
                System.out.println();
            }
        }

        int punktetotal = pluspunkte + minuspunkte;


        return punktetotal;
    }

    // Methode um die Anzahl aufgenommener Karten der entsprechenden Farbe zurückzugeben
    public int getAnzahlMagenta() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int anzahl = 0;


        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //Das Array aufgenommeneKarten wird durchlaufen und wenn das Objekt Karte die entsprechende Farbe hat wird der Zähler um +1 erhöht
        for (int a = 0; a < i; a++) {
            Farbkarte tmp = aufgenommeneKarten.get(a);

            if ("magenta".equals(tmp.getFarbe())) {
                anzahl++;

            } else {
                System.out.println("Fehler aufgetreten!");
            }
            
        
        }

        return anzahl;
    }

    // Methode um die Anzahl aufgenommener Karten der entsprechenden Farbe zurückzugeben
    public int getAnzahlOrange() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int anzahl = 0;


        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //Das Array aufgenommeneKarten wird durchlaufen und wenn das Objekt Karte die entsprechende Farbe hat wird der Zähler um +1 erhöht
        for (int a = 0; a < i; a++) {
            Farbkarte tmp = aufgenommeneKarten.get(a);

            if ("orange".equals(tmp.getFarbe())) {
                anzahl++;

            } else {
                System.out.println("Fehler aufgetreten!");
            }
        

        }

        return anzahl;
    }

    // Methode um die Anzahl aufgenommener Karten der entsprechenden Farbe zurückzugeben
    public int getAnzahlBlau() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int anzahl = 0;


        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //Das Array aufgenommeneKarten wird durchlaufen und wenn das Objekt Karte die entsprechende Farbe hat wird der Zähler um +1 erhöht
        for (int a = 0; a < i; a++) {
            Farbkarte tmp = aufgenommeneKarten.get(a);

            if ("blau".equals(tmp.getFarbe())) {
                anzahl++;

            } else {
                System.out.println("Fehler aufgetreten!");
            }
        
        }

        return anzahl;
    }

    // Methode um die Anzahl aufgenommener Karten der entsprechenden Farbe zurückzugeben
    public int getAnzahlBraun() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int anzahl = 0;


        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //Das Array aufgenommeneKarten wird durchlaufen und wenn das Objekt Karte die entsprechende Farbe hat wird der Zähler um +1 erhöht
        for (int a = 0; a < i; a++) {
            Farbkarte tmp = aufgenommeneKarten.get(a);

            if ("braun".equals(tmp.getFarbe())) {
                anzahl++;

            } else {
                System.out.println("Fehler aufgetreten!");
            }
        
        }

        return anzahl;
    }

    // Methode um die Anzahl aufgenommener Karten der entsprechenden Farbe zurückzugeben
    public int getAnzahlGelb() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int anzahl = 0;


        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //Das Array aufgenommeneKarten wird durchlaufen und wenn das Objekt Karte die entsprechende Farbe hat wird der Zähler um +1 erhöht
        for (int a = 0; a < i; a++) {
            Farbkarte tmp = aufgenommeneKarten.get(a);

            if ("gelb".equals(tmp.getFarbe())) {
                anzahl++;

            } else {
                System.out.println("Fehler aufgetreten!");
            }
        
        }

        return anzahl;
    }

    // Methode um die Anzahl aufgenommener Karten der entsprechenden Farbe zurückzugeben
    public int getAnzahlGrau() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int anzahl = 0;


        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //Das Array aufgenommeneKarten wird durchlaufen und wenn das Objekt Karte die entsprechende Farbe hat wird der Zähler um +1 erhöht
        for (int a = 0; a < i; a++) {
            Farbkarte tmp = aufgenommeneKarten.get(a);

            if ("grau".equals(tmp.getFarbe())) {
                anzahl++;

            } else {
                System.out.println("Fehler aufgetreten!");
            }
        }

        return anzahl;
    }
// Methode um die Anzahl aufgenommener Karten der entsprechenden Farbe zurückzugeben
    public int getAnzahlGruen() {

        //Zählervariablen, welche um +1 erhöht werden, wenn entsprechende Farbe in aufgenommeneKarten vorhanden
        int anzahl = 0;


        //Länge der List aufgenommeneKarten
        int i = aufgenommeneKarten.size();

        //for-Schleife, welche so oft durchlaufen wird wie Karten vorhanden
        //Das Array aufgenommeneKarten wird durchlaufen und wenn das Objekt Karte die entsprechende Farbe hat wird der Zähler um +1 erhöht
        for (int a = 0; a < i; a++) {

            Farbkarte tmp = aufgenommeneKarten.get(a);
            
            if ("gruen".equals(tmp.getFarbe())) {
                anzahl++;

            } else {
                System.out.println("Fehler aufgetreten!");
            }

        }
        return anzahl;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }

    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * @return the istAktiv
     */
    public boolean IstAktiv() {
        return istAktiv;
    }

    /**
     * @param istAktiv the istAktiv to set
     */
    public void setIstAktiv(boolean istAktiv) {
        this.istAktiv = istAktiv;
    }

}
